package com.wuwei.tms.interceptor;

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wuwei.tms.exception.TmsException;
import com.wuwei.tms.utils.result.Result;
import com.wuwei.tms.utils.token.TokenCache;
import com.wuwei.tms.utils.token.TokenUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * 当用户在别地地方登录后，根据工号存储在服务器的token和用户在请求头中携带的token就不一样了，此时如果两个token不一样，就跳转登录
 */
@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //登录验证
        //登录成功(session 中有 user) -》放行
        // 不拦截 OPTIONS 请求
        if (request.getMethod().equals("OPTIONS")) {
            return true;
        }
        /*
        这里先获取请求头的token，再根据请求头的token获取empno。
        这时如果有人在别处登录，此时之前登录的用户所拥有的token和此时该用户工号对应的真正的token就不一样了。
        此时就拦截
         */
        String token = request.getHeader("Authorization");
        Long empno = TokenUtil.getEmpnoFromToken(token);
        String token1 = TokenCache.getToken(empno);
        if (token1 != null && token1.equals(token)){
            return true;
        }
        //登录失败-》跳转登录
//        这里如果登录失败，返回状态码401，同时携带错误信息
        //这里分2种情况，一种是账号在别处登录，此时服务器里的token1和传来的token不一致
        //一种是服务器里没有token，如果服务器没有token，但是传来的请求头有token，是因为服务器发生了重启
        if (token1 == null) {//这种是token1为空，但是传来的token不为空
            response.setStatus(HttpServletResponse.SC_OK);
            response.setContentType("application/json;charset=UTF-8"); // 设置字符编码为UTF-8
            ServletOutputStream outputStream = response.getOutputStream();
            // 在响应中携带数据
            Result<String> result = new Result();
            result.setCode(50016);
            String jsonString = JSON.toJSONString(result);
            outputStream.write(jsonString.getBytes());
            outputStream.close();
            return false;
        }
        response.setStatus(HttpServletResponse.SC_OK);
        response.setContentType("application/json;charset=UTF-8"); // 设置字符编码为UTF-8
        ServletOutputStream outputStream = response.getOutputStream();
        // 在响应中携带数据
        Result<String> result = new Result();
        result.setCode(50012);
        String jsonString = JSON.toJSONString(result);
        outputStream.write(jsonString.getBytes());
        outputStream.close();
        return false;
    }
}
